/* Start of Code */ #include #include #include "FastLED.h" #include #include #include #define OLED_RESET 4 #define SCREEN_ADDRESS 0x3C Adafruit_SH1106 display(OLED_RESET); #define NUM_LEDS 60 // Number of LEDs on Ring #define DATA_PIN_RING 3 // Pin 3 connected to RGB Ring CRGB leds_RING[NUM_LEDS]; HMC5883L compass; int fixedHeadingDegrees; // Used to store Heading value void setup() { Serial.begin(9600); Wire.begin(); FastLED.addLeds(leds_RING, NUM_LEDS); display.begin(SH1106_SWITCHCAPVCC, SCREEN_ADDRESS); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(22,10); display.println("mircemk");// Print text display.setCursor(22,40); display.println("COMPASS"); display.display(); delay(2000); // Set measurement range compass.setRange(HMC5883L_RANGE_1_3GA); // Set measurement mode compass.setMeasurementMode(HMC5883L_CONTINOUS); // Set data rate compass.setDataRate(HMC5883L_DATARATE_30HZ); // Set number of samples averaged compass.setSamples(HMC5883L_SAMPLES_8); // Set calibration offset. See HMC5883L_calibration.ino compass.setOffset(27, 200); } void loop() { Vector norm = compass.readNormalize(); // Calculate heading float heading = atan2(norm.YAxis, norm.XAxis); // Set declination angle on your location and fix heading // You can find your declination on: http://magnetic-declination.com/ // (+) Positive or (-) for negative // For Montreal,QC declination angle is -14'35W (negative) // Formula: (deg + (min / 60.0)) / (180 / M_PI); float declinationAngle = (5.0 + (3.0 / 60.0)) / (180 / M_PI); //for Ohrid heading -= declinationAngle; // Correct for heading < 0deg and heading > 360deg if (heading < 0) { heading += 2 * PI; } if (heading > 2 * PI) { heading -= 2 * PI; } // Convert to degrees float headingDegrees = heading * 180/M_PI; // To Fix rotation speed of HMC5883L Compass module if (headingDegrees >= 1 && headingDegrees < 240) { fixedHeadingDegrees = map (headingDegrees * 100, 0, 239 * 100, 0, 179 * 100) /100.00; } else { if (headingDegrees >= 240) { fixedHeadingDegrees = map (headingDegrees * 100, 240 * 100, 360 * 100, 180 * 100, 360 * 100) /100.00; } } int headvalue = fixedHeadingDegrees/4.88; int ledtoheading = map(headvalue, 0, 59, 59, 0); Serial.print("Angle:"); Serial.print(headingDegrees); Serial.println(); display.clearDisplay(); display.setTextSize(3); display.setTextColor(WHITE); display.setCursor(20,10); display.println("Angle"); display.setCursor(10,40); display.println(headingDegrees); display.display(); FastLED.clear(); if (ledtoheading == 0){ leds_RING[59] = CRGB::Red; leds_RING[0] = CRGB::Green; leds_RING[58] = CRGB::Green; } else { if (ledtoheading == 59){ leds_RING[0] = CRGB::Red; leds_RING[59] = CRGB::Green; leds_RING[1] = CRGB::Green; } else { leds_RING[ledtoheading] = CRGB::Red; leds_RING[ledtoheading+1] = CRGB::Green; leds_RING[ledtoheading-1] = CRGB::Green; } } FastLED.setBrightness(50); FastLED.show(); delay(100); } /* End of Code */